LOADING...

加载过慢请开启缓存(浏览器默认开启)

loading

JavaWeb(XML)

2022/9/4 后端

目录

  • XML的作用
  • XML书写语法规则
  • Java解析XML
  • XML语义约束
  • XPath路径表达式
  • B/S架构模式
  • Servlet开发技巧
  • Servlet执行原理
  • Java Web核心特性
  • Servlet核心对象
  • JSP九大内置对象
  • EL表达式
  • JSTl常用标签

XML

XML(EXtensible Markup Language):可扩展标记语言,用来存储数据的标准语言

XML与HTML的比较:

  • XML与HTML非常相似,都是编写标签
  • XML没有预定义标签,HTML存在大量预定义标签
  • XML重在保存与传输数据,HTML用于显示信息

XML的用途:

  • Java程序的配置描述文件
  • 用于保存程序产生的数据
  • 网络间的数据传输

XML文档结构

  • 第一行必须是XML声明
    • 说明XML文档的基本信息,包括版本号与字符集,写在XML第一行
<?xml version="1.0" encoding="UTF-8"?> //encoding:编码
version 代表版本号1.0/1.1
encoding UTF-8设置字符集,用于支持中文
  • 有且只有一个根节点
  • XML标签的书写规则与HTML相同

XML标签书写规则

  • 合法的标签名

    • 标签名要有意义
    • 建议使用英文,小写字母,单词之间使用“-”分割
    • 建议多级标签之间不要存在重名的情况
  • 适当的注释与缩进

  • 合理使用属性

    • 标签属性用于描述标签不可或缺的信息
    • 对标签分组或者为标签设置Id时常用属性表示
  • 特殊字符与CDATA标签

    • ‘<’ 和 ‘>’ 特殊字符,会破坏文档结构

    • 可以使用实体引用

    • 实体引用 对应符号 说明
      &lt < 小于
      &gt > 大于
      &amp & 和号
      &apos 单引号
      &quot 双引号
    • CDATA标签:指不应由XMl解析器进行解析的文本数据,原意输出

    • 从“ < ! [CDATA[“开始,到”]] > ” 结束

  • 有序的子元素

    • 在XML多层嵌套的子元素中,标签前后顺序应保持一致

XML语义约束

  • XML语义约束有两种定义方式:DTDXML Schema
  • DTD(Document Type Definition, 文档类型定义)是一种简单易用的语义约束方式
  • DTD文件的扩展名为.dtd
  • 利用DTD中的<!ELEMENT>标签,我们可以定义XML文档中允许出现的节点及数量,以hr.xml为例:
定义hr结点下只允许出现1个employee子节点
<!ELEMENT hr(employee)>
employee节点下必须包含以下四个结点,且按顺序出现
<!ELEMENT employee (name,age,salary,department)>
定义name标签体只能是文本,#PCDATA代表文本元素
<!ELEMENT name(#PCDATA)>
DTD定义节点数量
  • 如某个子节点需要多次重复出现,则需要在子节点后增加相应的描述符
hr节点下最少出现1个employee子节点
<!ELEMENT hr(employee+)>
hr节点下可出现0..n个employee子节点
<!ELEMENT hr(employee*)>
hr节点下最多出现1个employee子节点
<!ELEMENT hr(employee?)>
XML引用DTD文件
  • 在XML中使用<!DOCTYPE>标签来引用DTD文件
书写格式:
<!DOCTYPE 根节点 SYSTEM "dtd文件路径">
示例:
<!DOCTYPE hr SYSTEM "hr.dtd">

XML Schema(主流)

  • XML Schema比DTD更为复杂,提供了更多功能
  • XML Schema提供了数据类型、格式限定、数据范围等特性
  • XML Schema是W3C标准 [万维网(World Wide Web)]

DOM文档对象模型

DOM(Document Object Model)定义了访问和操作XML文档的标准方法

Dom4j

Dom4j是一个易用的、开源的库,用于解析XML。它应用于Java平台,具有性能优异、功能强大和极其易使用的特点。

  • Dom4j将XML视为Document对象
  • XML标签被Dom4j定义为Element对象

对文件进行读取

对文件进行写入(Source-Format字段对齐)

XPath路径表达式

  • XPath路径表达式是XML文档中查找数据的语言
  • 掌握XPath可以极大的提高在提取数据时的开发效率
  • 学习XPath本质就是掌握各种形式表达式的使用技巧
最常用的基本表达式
表达式 描述
nodename 选取此节点的所有子节点
/ 从根节点选取
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性
XPath基本表达式案例
路径表达式 结果
bookstore 选取bookstore元素的所有子节点
/bookstore 选取根元素bookstore,注释:假如路径起始于正斜杠(/),则此路径始终代表到某元素的绝对路径
bookstore/book 选取属于bookstore的子元素的所有book元素
//book 选取所有book子元素,而不管它们在文档中的位置
bookstore//book 选择属于bookstore元素的后代的所有book元素,而不管它们位于bookstore之下的什么位置
//@lang 选取名为lang的所有属性
XPath谓语表达式

Jaxen介绍

  • Jaxen是一个Java编写的开源的XPath库。这是适应多种不同的对象模型,包括DOM,XOM,dom4j和JDOM

  • Don4j底层依赖Jaxen实现XPath查询

package com.imooc.m4j;

import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

public class XPathTestor {
    public void xpath(String xpathExp){
        String file = "E:/lianxi/xml/hr.xml";
        SAXReader reader = new SAXReader();
        try {
            Document document = reader.read(file);
            
            List<Node> nodes = document.selectNodes(xpathExp);
            for(Node node : nodes){
                Element emp = (Element)node; //转换对象
                System.out.println(emp.attributeValue("no"));
                System.out.println(emp.elementText("name"));
                System.out.println(emp.elementText("age"));
                System.out.println(emp.elementText("salary"));
                System.out.println("==============================");
            }
        } catch (DocumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        XPathTestor testor = new XPathTestor();
//        testor.xpath("/hr/employee");
//        testor.xpath("//employee");
//        testor.xpath("//employee[salary<4000]");
//        testor.xpath("//employee[name='李铁柱']");
//        testor.xpath("//employee[@no=3304]");
//        testor.xpath("//employee[1]"); 编号最小的第一个
//        testor.xpath("//employee[last()]"); 获取最后一个
        //testor.xpath("//employee[position()<3]"); 当前位置小于3
        testor.xpath("//employee[3] | //employee[8]"); //获取第3名和第八名员工
        
    }
}